/**
 * @file Rs485_transfer.h
 * @author Chen Jiale (530673764@qq.com)
 * @brief 
 * @version V1.0.0
 * @date 2023-12-09
 * 
 * @copyright Moorgen Intelligent Technologies Copyright (c) 2023
 * 
 */
#ifndef __RS485_TRANSFER_H__
#define __RS485_TRANSFER_H__
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>

#define RS485_RBUF_FIFO_SIZE	1024		// 接收缓存大小
#define RS485_SBUF_FIFO_SIZE	1024		// 发送缓存大小

//=====================================< 总线相关参数 >==========================================
#define RS485_WAIT_CNT			25			//退避等待次数(最小等待n*40 = 100ms)
#define RS485_RESEND_MAX		4			//重发次数(4+1)=5
#define RS485_RXEND_TIME		6			//单包接收完成时间
#define RS485_RESEND_WAIT_TIME	80			//重发等待时间
#define RS485_R_DATA_LEN		200			//接收缓存长度（不可超过255）
#define RS485_T_DATA_LEN		200			//发送缓存长度（不可超过255）


/**
 * @brief 设置发送状态标记
 * 
 * @param Is_Txing 底层硬件是否正在发送
 * @author Chen Jiale (530673764@qq.com)
 * @date 2023-12-09
 */
void Rs485_SendData_Set(bool Is_Txing);

/**
 * @brief 总线是否繁忙标记
 * 
 * @param Is_Busy 是否繁忙
 * @author Chen Jiale (530673764@qq.com)
 * @date 2023-12-09
 */
void Rs485_Busy_Set(bool Is_Busy);

/**
 * @brief 发送数据推入缓存
 * 
 * @param pbuf 发送数据指针
 * @param len 发送数据长度
 * @param wait_ack 是否等待应答
 * @param Resend_Time 重发次数（0x7F会一直重发，可用于注册）
 * @author Chen Jiale (530673764@qq.com)
 * @date 2023-12-09
 * @return int32_t 剩余缓存数据长度
 */
int32_t Rs485_Send_Data_Push(uint8_t *pbuf, uint8_t len, bool wait_ack,uint8_t Resend_Time);

/**
 * @brief 发送数据从缓存取出
 * 
 * @author Chen Jiale (530673764@qq.com)
 * @date 2023-12-09
 * @return int32_t 剩余缓存数据长度
 */
int32_t Rs485_Send_Data_Pop(void);

/**
 * @brief 485发送进程（轮询调用）
 * 
 * @author Chen Jiale (530673764@qq.com)
 * @date 2023-12-09
 * @return true 有数据需要发送
 * @return false 无数据需要发送
 */
bool Rs485_SendProcess(void);

/**
 * @brief 发送数据定时进程(1ms调用)
 * 
 * @author Chen Jiale (530673764@qq.com)
 * @date 2023-12-09
 */
void Rs485_SendProcess_Timer(void);

/**
 * @brief 重发进程(轮询调用)
 * 
 * @author Chen Jiale (530673764@qq.com)
 * @date 2023-12-09
 */
void Rs485_ReSendProcess(void);

/**
 * @brief 重发数据定时进程(10ms调用)
 * 
 * @author Chen Jiale (530673764@qq.com)
 * @date 2023-12-09
 */
void Rs485_ReSendProcess_Timer(void);
//===================================< 接收数据 >===================================//
/**
 * @brief 清理接收结构体
 * 
 * @author Chen Jiale (530673764@qq.com)
 * @date 2023-12-09
 */
void Rs485_Rx_Clear(void);

/**
 * @brief 接收分包定时(1ms)
 * 
 * @author Chen Jiale (530673764@qq.com)
 * @date 2023-12-09
 */
void Rs485_RxOverTimIsr(void);

/**
 * @brief 串口接收字节
 * 
 * @param Recv_Byte 接收到的字节
 * @author Chen Jiale (530673764@qq.com)
 * @date 2023-12-09
 */
void Rs485_Receive_Byte(uint8_t Recv_Byte);

/**
 * @brief Rs485接收进程(轮询调用)
 * 
 * @param pbuf 接收数据存放指针
 * @param len 接收数据长度存放变量指针
 * @author Chen Jiale (530673764@qq.com)
 * @date 2023-12-09
 * @return true 存在接收缓存数据
 * @return false 无数据
 */
bool Rs485_RecvProcess(uint8_t *pbuf,uint8_t *len);
#endif
